import java.util.Arrays;

/**
 * 在java中，字符串没有\0
 * String 类被final修饰，不能被继承
 * ！！！！value[]  hash
 */
public class String_ {
    public static void func(String str,char[] chars){
        str = "english";
        chars[0] = 'b';
    }

    public static void main(String[] args) {
//        String str = "hello";
//        String str3 = new String("hello");
//        System.out.println(str == str3);
//        String str2 = "he" + "llo";// 这里编译器会自动处理，先将he llo进行组装，在编译时已经确定了为hello常量
//        System.out.println(str == str2);
        // 但是！！下面的情况：str2_是变量，在编译时不知道是什么，
        String str2_ = "he";
        String str3_ = str2_ + "llo";
        String str3 = new String("hello");
        String str4 = "hello";
        /** 拼接过程
         * 1）、底层创建一个 StringBuilder 对象null（初始容量为16）
         * 2）、开始拼接第一个字符串"he"
         * 3）、拼接第二个字符串"llo"  完成后返回一个StringBuilder的对象
         * 4）、调用 StringBuilder的 toString方法
         * public String toString() {
         *         // Create a copy, don't share the array
         *         return new String(value, 0, count);
         *     }
         *     最后返回一个新的对象
         */
//        System.out.println(str3_ == str);// F

//        String str1 = new String("he") + new String("llo");
//        str1.intern();// 手动入池：当常量池有该常量时，就不入，没有则入常量池
//        String str = "hello";
//        System.out.println(str == str1);

        // 常量池：
        //      Class文件常量池（int a = 10...）(磁盘)
        //      运行时常量池：当程序把编译好的字节码文件加载到JVM中，会生成一个运行时常量池[方法区]
        //      字符串常量池：本质上是一个哈希表，JDK1.8之后，放在堆里
    }
//    public static void main(String[] args) {
//
//        String str = "abcdef";
//        String str2 = new String("abcdef");
//        char[] chars = {'h','e','l','l','o'};
//        func(str,chars);
//        System.out.println(str);// 这里只是给形参修改了引用的值，没有影响实参的指向
//        System.out.println(Arrays.toString(chars));
//    }
}
